原始题目:剑指 Offer 10- II. 青蛙跳台阶问题 (opens new window)

解题思路:

设跳上 nn 级台阶可能有 f(n)f(n) 中可能性,当青蛙跳到最后的时候,会有两种情况,一种是跳 11 级,一种是跳 22 级。

  • 当为 11 级的时候,剩下的 n1n-1 级台阶有 f(n1)f(n-1) 种跳法。
  • 当为 22 级的时候,剩下的 n2n-2 级台阶有 f(n2)f(n-2) 种跳法。

因此很容易得到递推式

f(n)=f(n1)+f(n2)f(n) = f(n-1) + f(n-2)

其递推性质为斐波那契数列,因此本题可以转化为斐波那契数列求第 n 项的做法。不同的是初始条件不同

  • 本题的初始条件为 f(0)=1,f(1)=1,f(2)=2f(0) = 1, f(1) = 1, f(2) = 2
  • 斐波那契数列初始条件为 f(0)=0,f(1)=1,f(2)=1f(0) = 0, f(1) = 1, f(2) = 1

因此可以使用动态规划来接题。

代码:

public int numWays(int n) {
    if (n == 0 || n == 1) {
        return 1;
    }
    int a = 1;
    int b = 1;
    int sum = 0;
    while(--n > 0){
        sum = (a + b) % 1000000007;
        a = b;
        b = sum;
    }
    return sum;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

复杂度分析

  • 时间复杂度O(N)O(N):需要进行 NN 次循环,每次循环的操作是 O(1)O(1) 的。

  • 空间复杂度O(1)O(1):使用常数级的空间。

上次更新: 2023/10/15